package com.springboot.wisdom.system.service.impl;

import cn.hutool.core.date.DateTime;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.toolkit.StringUtils;
import com.github.yulichang.base.MPJBaseServiceImpl;
import com.github.yulichang.wrapper.MPJLambdaWrapper;
import com.springboot.wisdom.common.common.ResultUtil;
import com.springboot.wisdom.common.common.bean.DeleteDTO;
import com.springboot.wisdom.common.common.bean.MyResult;
import com.springboot.wisdom.serviceApi.system.model.dto.DeptDTO;
import com.springboot.wisdom.serviceApi.system.model.entity.DeptDO;
import com.springboot.wisdom.serviceApi.system.model.vo.DeptTree;
import com.springboot.wisdom.system.mapeer.DeptMapper;
import com.springboot.wisdom.system.service.DeptService;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.util.List;

@Service
@Slf4j
public class DeptServiceImpl extends MPJBaseServiceImpl<DeptMapper, DeptDO> implements DeptService {

    @Resource
    private DeptMapper deptMapper;

    /**
     * 0：表示根顶级菜单。
     *
     * @param deptDTO 查询条件。
     * @return
     */
    @Override
    public MyResult<List<?>> getTree(DeptDTO deptDTO) {
        /**
         * SELECT * FROM sys_dept a
         * LEFT JOIN sys_dept b ON b.dept_parent_id=a.dept_id
         * WHERE a.dept_parent_id=0
         * and b.dept_name like'%研发部%' and b.dept_principal_id like '%张三%'
         */
        List<DeptTree> deptTree = deptMapper.selectJoinList(DeptTree.class, new MPJLambdaWrapper<DeptDO>()
                        .selectAll(DeptDO.class)
                        .selectCollection(DeptTree::getChildren, map -> {
                            map.all(DeptDO.class);
                            map.result("t", DeptDO::getDeptName, DeptTree::getDeptParentName);
//                    map.result(DeptDO::getDeptName);
                            return map;
                        })
                        .leftJoin(DeptDO.class, "b", DeptDO::getDeptParentId, DeptDO::getDeptId)
                        // 部门名称。
                        .likeIfExists("b", DeptDO::getDeptName, deptDTO.getDeptName())
                        // 负责人。
                        .likeIfExists("b", DeptDO::getDeptPrincipalId, deptDTO.getDeptPrincipalId())
                        // 根节点。
                        .eq(DeptDO::getDeptParentId, "0")
        );

        // 去除空id的内容。
        for (DeptTree tree : deptTree) {
            for (DeptTree child : tree.getChildren()) {
                if (child.getDeptId() == null) {
                    tree.setChildren(null);
                }
            }
        }
        return ResultUtil.success(deptTree);
    }

    @Override
    public MyResult<String> add(DeptDTO deptDTO) {
        int result = 0;
        // 添加公司。
        if (StringUtils.isBlank(deptDTO.getDeptParentId())) {
            result = deptMapper.insert(new DeptDO(null, deptDTO.getDeptName(), "0", "0"
                    , deptDTO.getDeptPrincipalId(), deptDTO.getDeptPrincipalPhone(), deptDTO.getDeptPrincipalEmail()
                    , 0L, "创建人", null, null));
        } else {  // 添加部门。
            result = deptMapper.insert(new DeptDO(null, deptDTO.getDeptName(), "1", deptDTO.getDeptParentId()
                    , deptDTO.getDeptPrincipalId(), deptDTO.getDeptPrincipalPhone(), deptDTO.getDeptPrincipalEmail()
                    , 0L, "创建人", null, null));
        }
        System.out.println("result = " + result);
        return result != 0 ? ResultUtil.success("添加成功") : ResultUtil.error("添加失败");
    }

    @Override
    public MyResult<String> edit(DeptDTO deptDTO) {
        DeptDO deptDO = new DeptDO();
        deptDO.setDeptId(deptDTO.getDeptId());
        deptDO.setDeptName(deptDTO.getDeptName());
        deptDO.setDeptPrincipalId(deptDTO.getDeptPrincipalId());
        deptDO.setDeptPrincipalPhone(deptDTO.getDeptPrincipalPhone());
        deptDO.setDeptPrincipalEmail(deptDTO.getDeptPrincipalEmail());
        deptDO.setUpdateTime(DateTime.now());
        int result = deptMapper.updateById(deptDO);
        return result > 0 ? ResultUtil.success("编辑成功") : ResultUtil.error("编辑失败");
    }

    @Override
    public MyResult<String> delete(String id) {
        int result = deptMapper.deleteById(id);
        return result > 0 ? ResultUtil.success("删除成功") : ResultUtil.error("删除失败");
    }

    @Override
    public MyResult<String> deleteTree(String id) {
        int result = deptMapper.delete(new LambdaQueryWrapper<DeptDO>().eq(DeptDO::getDeptId, id).or().eq(DeptDO::getDeptParentId, id));
        return result > 0 ? ResultUtil.success("删除成功") : ResultUtil.error("删除失败");
    }

    @Override
    public MyResult<String> deleteList(DeleteDTO<String> dto) {
        int result = deptMapper.deleteByIds(dto.getIdList());
        return result > 0 ? ResultUtil.success("删除成功 "+result +" 条") : ResultUtil.error("删除失败");
    }
}